package cn.sprouting.tool;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 随机车牌
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2021/11/5 9:20
 */
public class RandomLicensePlateTool {


    /**
     * 省份前缀
     */
    private static List<String> PROVINCE_LIST = CollUtil.newArrayList("京", "津", "冀", "晋", "蒙",
                                                                                "辽", "吉", "黑", "沪", "苏",
                                                                                "浙", "皖", "闽", "赣", "鲁",
                                                                                "豫", "鄂", "湘", "粤", "桂",
                                                                                "琼", "渝", "川", "贵", "云",
                                                                                "藏", "陕", "甘", "宁", "青", "新");
    /**
     * 车牌号码候选字母(无I/O)
     */
    private static List<String> PLATE_LIST = CollUtil.newArrayList(
            "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");


    /**
     * 随机生成一个车牌
     * @return
     */
    public static String getLicensePlate(){
        boolean aBoolean = RandomUtil.randomBoolean();
        return getLicensePlate(aBoolean, null);
    }


    /**
     * 随机生成国内新能源车牌
     * @param prefix 指定生成的车牌前缀，比如 晋、云、甘 等等
     * @return
     */
    public static String getLicensePlateNewEnergy(String prefix){
        return getLicensePlate(true, prefix);
    }

    /**
     * 随机生成国内非新能源车牌
     * @param prefix 指定生成的车牌前缀，比如 晋、云、甘 等等
     * @return
     */
    public static String getLicensePlate(String prefix){
        return getLicensePlate(false, prefix);
    }

    /**
     * 随机生成国内车牌
     * @param newEnergy 是否新能源车 {@link cn.sprouting.model.common.Constant.YesNoBoolean}
     * @param prefix 指定生成的车牌前缀，比如 晋、云、甘 等等
     * @return
     */
    public static String getLicensePlate(boolean newEnergy, String prefix){
        int length = 5;
        // 车所属省份
        if (StrUtil.isEmpty(prefix)){
            prefix = RandomUtil.randomEle(PROVINCE_LIST);
        }

        // 车牌构成元素
        List<String> componentList = new ArrayList<>();
        // 最多2位字母
        int index = RandomUtil.randomInt(0, 3);
        if (index > 0){
            for (int i = 0; i < index; i ++){
                componentList.add(RandomUtil.randomEle(PLATE_LIST));
            }
        }

        // 数字部分
        int surplus = length - index;
        for (int k = 0; k < surplus; k ++){
            componentList.add(String.valueOf(RandomUtil.randomInt(0, 10)));
        }

        // 打乱整个顺序
        Collections.shuffle(componentList);
        String join = StrUtil.join("", componentList);

        // 新能源
        String newEnergyStr = "";
        if (newEnergy){
            int k = RandomUtil.randomInt(0, 2);
            // 新能源车牌前缀为 D 或 F
            if (k == 0){
                newEnergyStr = "D";
            } else {
                newEnergyStr = "F";
            }
        }

        return prefix + RandomUtil.randomEle(PLATE_LIST) + newEnergyStr + join;
    }


}
